﻿package com.Galaxisfarm {
	// Bibliotecas da game engine Flixel
	import com.adamatomic.flixel.*;
	import flash.geom.Point;
	// Utilitários
	import flash.utils.*;
	
	public class Cowshed extends FlxSprite {
		// Sprite do celeiro
		[Embed(source = "../../data/cowshed.png")] private var ImgCowshed:Class;
		
		// Imagem do sprite selecionado
		private var _selected:FlxSprite;
		// Indica se o objeto está selecionado
		private var _is_selected:Boolean;
		// Itens
		private var _items:FlxArray;
		// Pontos de colisão
		private var _collide_points:FlxArray;
		// Posição do mouse
		private var _mouse_point:Point = null;
		
		// Método construtor
		public function Cowshed(X:Number, Y:Number, MousePoint:Point = null):void {
			// Carrega o sprite
			super(ImgCowshed, X, Y, false, false, 143, 123);
			
			// Define as animações
			addAnimation("normal", [0]);
			addAnimation("selected", [1]);
			addAnimation("not", [2]);
			
			_selected = null;
			
			// Inicialmente é definido como não selecionado
			_is_selected = false;
			
			// Inicializa a variável de itens
			_items = new FlxArray();
			
			// Define os valores inicias para os pontos de colisões
			_collide_points = new FlxArray;
			_collide_points[1] = null;
			_collide_points[2] = null;
			_collide_points[3] = null;
			_collide_points[4] = null;
			_collide_points[5] = null;
			_collide_points[6] = null;
			_collide_points[7] = null;
			
			// Define a posição do mouse, caso seja passada como parâmetro
			if (MousePoint != null) {
				_mouse_point = MousePoint;
				this.x = _mouse_point.x - this.width / 2;
				this.y = _mouse_point.y - this.height / 2;
			}
		}
		
		// Método chamado constantemente
		// redefine os pontos de colisão
		override public function update():void {
			// Se existe os pontos do mouse
			// atualiza os pontos de colisão
			if (_mouse_point != null) {
				var cursor_x:Number = _mouse_point.x - this.width / 2;
				var cursor_y:Number = _mouse_point.y - this.height / 2;
				
				// Pontos de colisão do celeiro
				_collide_points[1] = new Point(cursor_x + 0, cursor_y + 55);
				_collide_points[2] = new Point(cursor_x + 34, cursor_y + 16);
				_collide_points[3] = new Point(cursor_x + 106, cursor_y + 0);
				_collide_points[4] = new Point(cursor_x + 142, cursor_y + 51);
				_collide_points[5] = new Point(cursor_x + 135, cursor_y + 90);
				_collide_points[6] = new Point(cursor_x + 57, cursor_y + 122);
				_collide_points[7] = new Point(cursor_x + 10, cursor_y + 102);
			}
		}
		
		// Atualiza a posição do sprint pelo deslocamento
		// do mouse
		public function updatePositionByMouse():void {
			if (_mouse_point != null) {
				this.x = _mouse_point.x - this.width / 2;
				this.y = _mouse_point.y - this.height / 2;
			}
		}
		
		// Obtém os pontos de colisão
		public function getCollidePoints():FlxArray {
			return _collide_points;
		}
		
		// Obtém o primeiro item produzido
		// e remove ele do objeto
		public function getFirstItemAndRemove():* {
			if (totalItems() > 0) {
				var item:* = _items[0];
				_items.removeAt(0, true);
				return item;
			}
			
			return null;
		}
		
		// Retorna itens do objeto
		public function getItems():FlxArray {
			return _items;
		}
		
		// Quantidade de itens
		public function totalItems():int {
			return _items.length;
		}
		
		// Adiciona um novo item
		public function addItem(Item:*):void {
			_items.add(Item);
			Item.visible = true;
			GameState.getLyrSprites().add(Item);
		}
		
		// Método chamado quando o objeto está selecionado
		public function selected():void {
			if (PhaseState.getCowshedSelected()) {
				if (!_is_selected) {
					PhaseState.getCowshedSelected().visible = true;
					_is_selected = true;
				}
			}
		}
		
		// Método chamado para deselecionar o objeto
		public function unselected():void {
			if (PhaseState.getCowshedSelected()) {
				if (_is_selected) {
					PhaseState.getCowshedSelected().visible = false;
					_is_selected = false;
				}
			}
		}
		
		// Inidica se o objeto está selecionado
		public function isSelected():Boolean {
			return _is_selected;
		}
		
		// Recebe um novo item
		public function dropItem(Item:*):void {			
			// Se o item estiver em bom estado
			// ganha dinheiro, senão perde
			if (Item.isGood()) 
				Farm.setMoney(Farm.getMoney() + Item.getPrice());
			else
				Farm.setMoney(Farm.getMoney() - Item.getPrice());
			
			// Remove o item
			Item.kill();
		}
	}
}